package com.hgl.bi.common.utils;

import com.hgl.bi.common.constant.ErrorCode;
import com.hgl.bi.common.exception.BusinessException;
import org.apache.xmlbeans.ResourceLoader;

import java.io.*;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * @program: BI
 * @description: 文件工具类
 * @author: hgl
 * @create: 2025-02-09 21:43
 */
public class FileUtil {

    /**
     * Excel转csv
     * @param content 表格内容
     * @return String
     * @author hgl
     */
    public static String toCsv(List<Map<Integer, String>> content) {
        // 1. 空检查（使用原生语法替代CollUtil）
        if (content == null || content.isEmpty())  {
            return "";
        }

        // 2. CSV构建器（预分配初始容量提升性能）
        StringBuilder csv = new StringBuilder(content.size()  * 128);

        // 3. 表头处理
        Map<Integer, String> firstRow = content.get(0);
        if (!firstRow.isEmpty())  {
            String headerLine = firstRow.values().stream()
                    .filter(s -> s != null && !s.isEmpty())  // 替代ObjectUtils
                    .map(FileUtil::escapeCsv)       // 添加CSV转义
                    .collect(Collectors.joining(","));
            csv.append(headerLine).append('\n');
        }

        // 4. 数据行处理
        content.stream()
                .skip(1) // 跳过标题行
                .filter(row -> !row.isEmpty())
                .forEach(row -> {
                    String dataLine = row.values().stream()
                            .filter(s -> s != null && !s.isEmpty())
                            .map(FileUtil::escapeCsv)
                            .collect(Collectors.joining(","));
                    csv.append(dataLine).append('\n');
                });

        // 5. 标准化换行符（\n无需转换）
        return csv.toString();
    }

    /**
     * CSV字段转义处理（符合RFC4180规范）
     * @param field 原始字段内容
     * @return 转义后的字段
     */
    private static String escapeCsv(String field) {
        if (field == null) return "";

        // 需要包装的触发条件：包含引号/逗号/换行符
        boolean needWrap = field.contains("\"")
                || field.contains(",")
                || field.contains("\n");

        // 转义双引号为两个双引号
        String escaped = field.replace("\"",  "\"\"");

        return needWrap ? "\"" + escaped + "\"" : escaped;
    }

    /**
     * 加载提示词
     *
     * @return String
     */
    public static String loadPromptText(boolean isClean) throws IOException {
        String prompt = "";
        if (isClean) {
            prompt = "prompt/CleanPrompt.txt";
        } else {
            prompt = "prompt/AnalyzePrompt.txt";
        }
        try (InputStream is = ResourceLoader.class.getClassLoader().getResourceAsStream(prompt)) {
            if (is == null) throw new BusinessException(ErrorCode.LOAD_PROMPT_ERROR);
            return new Scanner(is, "UTF-8")
                    .useDelimiter("\\A").next();
        }
    }

    /**
     * 创建临时文件并写入内容
     */
    public static File createTempCSV(String content) throws IOException {
        File tempFile = File.createTempFile("cleaned_", ".csv");
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile))) {
            writer.write(content);
        }
        return tempFile;
    }
}
